/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package utils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

/**
 * Утилиты
 *
 * @author Fedor
 */
public class Util {

    private static String anyLetter = "[A-Za-zА-Яа-яЁё]*";
    private static String censoreReplacement = "...";
    public static final Gson json = new GsonBuilder().setPrettyPrinting().serializeNulls().serializeSpecialFloatingPointValues().create();
    private static final Random rnd = new Random();

    public static int getRandomInt(int n) {
        return rnd.nextInt(n);
    }

    public static int getRandomInt(int fromNumber, int toNumber) {
        return (toNumber - fromNumber >= 0) ? getRandomInt(toNumber - fromNumber + 1) + fromNumber : 0;
    }

    public static double getRandom() {
        return rnd.nextDouble();
    }

    public static double getRandom(double from, double to) {
        return (to - from >= 0) ? rnd.nextDouble() * (to - from) + from : 0;
    }

    /**
     * Заменяет null на пустую строку
     *
     * @param req reuquest
     * @return пустая или обрезанная строка
     */
    public static String fixNull(String req) {
        if (req == null) {
            return "";
        }
        return req.trim();
    }

    /**
     * Заменяет null на пустую строку
     *
     * @param req reuquest
     * @return пустая или обрезанная строка
     */
    public static String fixNull(Object req) {
        if (req == null) {
            return "";
        }
        return fixNull(req.toString());
    }

    /**
     * Возвращает int или -1 если null
     *
     * @param req String число или null
     * @return -1 или значение
     */
    public static int fixInt(String req) {
        int res = -1;
        if (req != null && req.length() > 0) {
            try {
                res = Integer.parseInt(req);
            } catch (NumberFormatException nfe) {
                System.out.println("NumberFormatException: " + nfe + ", request: " + req);
            }
        }
        return res;
    }

    /**
     * Возвращает int или -1 если null
     *
     * @param req String число или null
     * @return -1 или значение
     */
    public static Long fixLong(Object req) {
        Long res = -1L;
        if (req != null && req.toString().length() > 0) {
            try {
                res = Long.parseLong(req.toString());
            } catch (NumberFormatException nfe) {
                System.out.println("NumberFormatException: " + nfe + ", request: " + req);
            }
        }
        return res;
    }

    /**
     * Возвращает double или null
     *
     * @param req строка для парса double или null
     * @return
     */
    public static Double fixDouble(Object req) {
        Double res = null;
        if (req != null && req.toString().length() > 0) {
            try {
                res = Double.parseDouble(req.toString());
            } catch (NumberFormatException nfe) {
                System.out.println("NumberFormatException: " + nfe + ", request: " + req);
            }
        }
        return res;
    }

    /**
     * Генерирует MD5 hash для исходного текста
     *
     * @param text
     * @return
     */
    public static String Md5Hash(String text) {
        MessageDigest m = null;
        try {
            m = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException ex) {
            System.out.println("NoSuchAlgorithmException: " + ex);
        }
        byte[] data = text.getBytes();
        m.update(data, 0, data.length);
        BigInteger i = new BigInteger(1, m.digest());
        return String.format("%1$032X", i);
    }

    public static String censore(String in) {
        String out = in.replaceAll(anyLetter + "[ХхXx]+[УуYy]+[ЕеЁёЙйЯяEeYy]+" + anyLetter, censoreReplacement)
                .replaceAll("[ПпPp]+[ИиIi]+[ДдDd]+[АаAa]+[РрRr]+" + anyLetter, censoreReplacement)
                .replaceAll(anyLetter + "[ПпPp]+[ИиIi]+[ЗзZz]+[ДдDd]+" + anyLetter, censoreReplacement)
                .replaceAll(anyLetter + "[ЕеEe]+[БбBb]+[АаУуИиAaYyIi]+" + anyLetter, censoreReplacement)
                .replaceAll(anyLetter + "[БбBb]+[ЛлLl]+[ЯяAaYy]+" + anyLetter, censoreReplacement);
        return out;
    }
}
